x86: Ensure irq is disabled before taking vector_lock.
authorKeir Fraser <keir.fraser@citrix.com>
Fri, 21 Aug 2009 16:14:35 +0000 (17:14 +0100)
committerKeir Fraser <keir.fraser@citrix.com>
Fri, 21 Aug 2009 16:14:35 +0000 (17:14 +0100)
Fixed debug lock issue for taking vector lock.

Signed-off-by: Xiantao Zhang <xiantao.zhang@intel.com>
xen/arch/x86/io_apic.c
xen/arch/x86/irq.c

index ea7f8b2fa4f0b3b9a4a2cc0475f99f160981bae8..bc9ecd90cbe94d1461eb87e3929d2d36d1529aa7 100644 (file)
@@ -379,6 +379,7 @@ unsigned int set_desc_affinity(struct irq_desc *desc, cpumask_t mask)
     struct irq_cfg *cfg;
     unsigned int irq;
     int ret;
+    unsigned long flags;
     cpumask_t dest_mask;
 
     if (!cpus_intersects(mask, cpu_online_map))
@@ -386,11 +387,13 @@ unsigned int set_desc_affinity(struct irq_desc *desc, cpumask_t mask)
 
     irq = desc->irq;
     cfg = desc->chip_data;
-    
-    lock_vector_lock();   
+
+    local_irq_save(flags);
+    lock_vector_lock();
     ret = __assign_irq_vector(irq, cfg, mask);
     unlock_vector_lock();
-    
+    local_irq_restore(flags);
+
     if (ret < 0)
         return BAD_APICID;
 
index c1105802e3f3d82ebeee2939e144f46237653021..1f5e1a666dab291bae5338595d73c6ca514b4125 100644 (file)
@@ -55,6 +55,7 @@ DEFINE_PER_CPU(vector_irq_t, vector_irq) = {
 
 DEFINE_PER_CPU(struct cpu_user_regs *, __irq_regs);
 
+/* Must be called when irq disabled */
 void lock_vector_lock(void)
 {
     /* Used to the online set of cpus does not change